package common.util
{
	
	import flash.net.registerClassAlias;
	import flash.utils.ByteArray;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	import mx.collections.ArrayCollection;
	import mx.collections.Sort;
	import mx.collections.SortField;
	import mx.utils.ObjectUtil;
	
	import spark.components.supportClasses.DropDownListBase;

	public class DataUtil
	{
		public function DataUtil()
		{
		}
		
		/**
		 * 压缩并返回字节(client->server)
		 */ 
		public static function compress(data:Object):ByteArray{
			trace("*************压缩数据******************");
			var start:Number=new Date().getTime(); 
			var byteArray:ByteArray = new ByteArray();
			byteArray.writeObject(data);
			trace("压缩前：" + byteArray.length);
			byteArray.compress();
			var end:Number=new Date().getTime(); 
			trace("压缩后：" + byteArray.length);
			trace("耗时："+(end-start)+"毫秒");
			trace("**************************************");
			return byteArray;
		}
		
		/**
		 * 解压缩并返回对象(server->client)
		 */
		public static function decompress(byteArray:ByteArray):Object{
			trace("*************解压数据******************");
			var start:Number=new Date().getTime(); 
			var byte:ByteArray= byteArray; 
			trace("解压前：" + byte.length);
			byte.uncompress() //将数据进行解压缩 
			trace("解压后：" + byte.length);
			var obj:Object=byte.readObject(); 
			var end:Number=new Date().getTime();
			trace("耗时："+(end-start)+"毫秒");
			trace("**************************************");
			return obj;
		}
		
		/**
		 * 深度克隆
		 */	
		public static function clone(object:Object):Object{
			var qClassName:String = getQualifiedClassName(object);
			var objectType:Class = getDefinitionByName(qClassName) as Class;
			registerClassAlias(qClassName, objectType);
			return ObjectUtil.copy(object);
		}
		
		/**
		 * 深度克隆Array
		 */ 
		public static function cloneArr(arr:Array):Array{
			var newArray:Array = new Array(); 
			for(var i:int; i<arr.length; i++) { 
				newArray.push(clone(arr[i])); 
			} 
			return newArray; 
		}
		
		
		/**
		 * 从集合中获取匹配的某元素索引
		 * @ac 原始集合
		 * @acObjAttrName 原始集合中元素属性名称
		 * @objAttrValue 需要匹配的值
		 */ 
		public static function searchIndexOnArrayCollection(ac:ArrayCollection,acObjAttrName:String,objAttrValue:String):Number{
			var index:Number = -1;
			for(var i:int=0 ;i<ac.length;i++){
				var tmp:Object = ac.getItemAt(i) as Object;
				if(tmp[acObjAttrName]==objAttrValue){
					index=i;
					break;
				}
			}
			return index;
		}
		
		/**
		 * 转换集合中的元素类型
		 */ 
		public static function covertCollectionByClazz(ac:ArrayCollection,clazz:Class):ArrayCollection{
			var resultAc:ArrayCollection = new ArrayCollection();
			if(ac){
				for each(var obj:Object in ac){
					resultAc.addItem(obj as clazz);
				}
			}
			return resultAc;
		}
		
		/**
		 * 矫正为正确的数字精度
		 */
		public static function correctNumber(value:Number):Number{
			return Math.round(value*100)/100;
		}
		
		/**
		 * 根据条件从集合中获取
		 * @dd 下拉列表
		 * @ac 集合
		 * @acObjAttrName 集合对象属性名称
		 * @objAttrValue 对象属性值
		 * 
		 */
		public static function selectedDropDownListByCondition(dd:DropDownListBase,acObjAttrName:String,objAttrValue:String):void{
			var ac:ArrayCollection = dd.dataProvider as ArrayCollection;
			for each(var obj:Object in ac){
				if(obj[acObjAttrName] == objAttrValue){
					dd.selectedItem = obj;
					break;
				}
			}
		}
		
		/**
		 * 根据对象获取该对象所有属性的键关系集合
		 */ 
		public static function getKeyArrayByObjMap(objMap:Object):Array{
			var resultArr:Array = new Array();
			if(objMap){
				for(var key:String in objMap){
					resultArr[key] = objMap[key]; 
				}
			}
			return resultArr;
		}
		
		/**
		 * 根据分类条件-分类集合中的对应关系（某类型对应集合体）
		 * @param result 所有的结果集合
		 * @param typeKey 以对象中的该属性作为键生成键值关系,以某类型进行分类
 		 * @param clazz 需要转型并保存的类型，默认为空
		 */
		public static function getAllObjectTypeMapByKeyType(allArr:Array,typeKey:String,clazz:Class=null):Array{
			var resultArr:Array = new Array();
			if(allArr){
				for(var i:int=0; i<allArr.length; i++){
					var changeObj:Object = allArr[i];
					if(clazz){
						changeObj = changeObj as clazz;
					}
					var typeValue:String = changeObj[typeKey];
					if(typeValue){
						var newTypeList:Array = null;
						if(resultArr[typeValue]){
							newTypeList = resultArr[typeValue];
							newTypeList.push(changeObj);
						}else{
							newTypeList = new Array();
							newTypeList.push(changeObj);
							resultArr[typeValue] = newTypeList;
						}
					}
				}
			}
			return resultArr;
		}
		
		
		/**
		 * 根据键保存集合中元素键值对应关系
		 * @param result 所有的结果集合
		 * @param objKey 以对象中的该属性作为键生成键值关系
		 * @param clazz 需要转型并保存的类型，默认为空
		 */
		public static function getAllObjectKeyMapByKey(result:ArrayCollection,objAttr:String,clazz:Class=null):Array{
			var map:Array = new Array();;
			try{
				if(result){
					var length:int=result.length;
					for(var i:int=0;i<length;i++){
						if(result[i][objAttr]){
							if(clazz){
								map[result[i][objAttr]]= result[i] as clazz;
							}else{
								map[result[i][objAttr]]= result[i];
							}
						}
					}
				}
			}catch(error:Error){
				trace(error.getStackTrace());
			}
			return map;
		}
		
		/**
		 *根据返回的树结果集，构建前台所有键值缓存
		 * @param result 所有的结果集合
		 * @param objKey 以对象中的该属性作为键生成键值关系
		 * @param clazz 需要转型并保存的类型，默认为空
		 */
		public static function getAllMapByTreeArr(result:ArrayCollection,objAttr:String,clazz:Class=null):Array{
			var map:Array=new Array();
			try{
				//保存根菜单
				if(result){
					var sortResult:Array=result.toArray();
					var length:int=sortResult.length;
					for(var i:int=0;i<length;i++){
						var tempObj:Object=sortResult[i] ;
						if(tempObj){
							getChild(map,tempObj,objAttr,clazz);
						}
					}
				}
			}catch(error:Error){
				trace(error.getStackTrace());
			}
			return map;
		}
		
		//递归获取所有子节点，添加到Map中
		private static function getChild(map:Array,obj:Object,objAttr:String,clazz:Class=null):void{
			var child:ArrayCollection=obj.children;
			if(obj.hasOwnProperty(objAttr)){
				if(clazz){
					map[obj[objAttr]]=obj as clazz;
				}else{
					map[obj[objAttr]]=obj
				}
			}
			if(child){
				var sortChild:Array = child.toArray();
				var length:int=sortChild.length;
				for(var i:int=0;i<length;i++){
					var tempObj:Object=sortChild[i];
					if(tempObj){
						getChild(map,tempObj,objAttr,clazz);
					}
				}
			}
		}
		
	
		
		
//*********************************排序************************************************
		/**
		 * 排序树
		 */
		public static function sortTreeByAttr(result:ArrayCollection,sortObjAttr:String):Array{
			var resultArr:Array = null;
			try{
				//保存根菜单
				if(result){
					resultArr = sortData(result.toArray(),sortObjAttr);
					var length:int=resultArr.length;
					for(var i:int=0;i<length;i++){
						var tempObj:Object=resultArr[i] ;
						if(tempObj){
							sortChildTreeByAttr(tempObj,sortObjAttr);
						}
					}
				}
			}catch(error:Error){
				trace(error.getStackTrace());
			}
			return resultArr;
		}
		
		
		//递归排序所有子节点
		private static function sortChildTreeByAttr(obj:Object,sortObjAttr:String):void{
			var child:ArrayCollection=obj.children;
			if(child){
				var sortChild:Array = sortData(child.toArray(),sortObjAttr);
				obj.children = new ArrayCollection(sortChild);
				var length:int=sortChild.length;
				for(var i:int=0;i<length;i++){
					var tempObj:Object=sortChild[i];
					if(tempObj){
						sortChildTreeByAttr(tempObj,sortObjAttr);
					}
				}
			}
		}
		
		/**
		 * 排序
		 * @param allArr 需要进行排序的集合
		 * @param sortAttr 需要排序的模型字段
		 */
		public static function sortData(allArr:Array,sortAttr:String,sortType:int=0):Array{
			var resultArr:Array =null;
			if(allArr){
				resultArr = allArr.sortOn(sortAttr,sortType);
			}
			return resultArr;
		}
		
		/**
		 * 转换xml项为mapObj
		 */
		public static function converXmlToMapObj(xml:XML):Object{
			var dataMap:Object = {};
			for(var i:int = 0; i<xml.children().length();i++){
				var txl:XML = xml.children()[i];
				var key:String = txl.@key;
				var value:String = txl.@value;
				dataMap[key] = value;
			}
			return dataMap;
		}
	}
}